namespace MobileTrack.Core.Migrations
{
    using System;
    using System.Data.Entity.Migrations;
    using System.Diagnostics.CodeAnalysis;
    using System.Linq;
    using System.Web.Security;
    using MobileTrack.Core.Data;
    using MobileTrack.Core.Model;

    [ExcludeFromCodeCoverage]
    public sealed class MobileTrackConfiguration : DbMigrationsConfiguration<MobileTrackContext>
    {
        public MobileTrackConfiguration()
        {
            this.AutomaticMigrationsEnabled = false;
        }

        protected override void Seed(MobileTrackContext context)
        {
            InitializeRoles();
            InitializeData(context);

            // TODO: Remove this once we have the administration pages.
            InitializeDemoUsers();
        }

        private static void InitializeData(MobileTrackContext context)
        {
            if (!context.Marcas.Any())
            {
                var proveedor = new Proveedor { Nombre = "Proveedor 1", Direccion = "Direccion 1", Telefono = "011-4952-5879" };
                context.Proveedores.Add(proveedor);
                context.Marcas.Add(new Marca { Proveedor = proveedor, Codigo = 1, EsOperador = false, Nombre = "Sin Datos" });
                context.Marcas.Add(new Marca { Proveedor = proveedor, Codigo = 1144, EsOperador = false, Nombre = "Nokia" });

                proveedor = new Proveedor { Nombre = "TELEFONICA MOVILES ARGENTINA S.A.", Direccion = "RIVADAVIA 535", Telefono = "5130-4392" };
                context.Proveedores.Add(proveedor);
                context.Marcas.Add(new Marca { Proveedor = proveedor, Codigo = 1297, EsOperador = true, Nombre = "Movistar" });

                proveedor = new Proveedor { Nombre = "AMX ARGENTINA S.A.", Direccion = "AV. DE MAYO 878", Telefono = "4109-8888" };
                context.Proveedores.Add(proveedor);
                context.Marcas.Add(new Marca { Proveedor = proveedor, Codigo = 407, EsOperador = true, Nombre = "Claro" });

                proveedor = new Proveedor { Nombre = "TELECOM PERSONAL S.A.", Direccion = "AV.CORRIENTES 554", Telefono = "4968-6387" };
                context.Proveedores.Add(proveedor);
                context.Marcas.Add(new Marca { Proveedor = proveedor, Codigo = 721, EsOperador = true, Nombre = "Personal" });

                proveedor = new Proveedor { Nombre = "SAMSUNG ELECTRONICS ARG. S.A.", Direccion = "AV. SAN JUAN 2776", Telefono = "308-4777/4949/4" };
                context.Proveedores.Add(proveedor);
                context.Marcas.Add(new Marca { Proveedor = proveedor, Codigo = 799, EsOperador = false, Nombre = "Samsung" });

                proveedor = new Proveedor { Nombre = "LG ELECTRONICS ARGENTINA S.A", Direccion = "JUANA MANSO 969 PISO 5 TORRE NORTE", Telefono = "5352-5462" };
                context.Proveedores.Add(proveedor);
                context.Marcas.Add(new Marca { Proveedor = proveedor, Codigo = 584, EsOperador = false, Nombre = "LG" });

                proveedor = new Proveedor { Nombre = "BGH SOCIEDAD ANONIMA", Direccion = "BRASIL 731", Telefono = "4309-2001/2022/2" };
                context.Proveedores.Add(proveedor);
                context.Marcas.Add(new Marca { Proveedor = proveedor, Codigo = 636, EsOperador = false, Nombre = "Motorola" });
                context.Marcas.Add(new Marca { Proveedor = proveedor, Codigo = 838, EsOperador = false, Nombre = "Sony" });

                context.SaveChanges();
            }
        }

        private static void InitializeRoles()
        {
            foreach (var rol in Constants.Roles)
            {
                if (!Roles.RoleExists(rol))
                {
                    Roles.CreateRole(rol);
                }
            }
        }

        private static void InitializeDemoUsers()
        {
            var sucursalRol = Roles
                .GetAllRoles()
                .FirstOrDefault(r => r.EndsWith(Constants.SucursalRoleSuffix, StringComparison.OrdinalIgnoreCase));

            GenerateUser("admin", Constants.AdministradorRole);
            GenerateUser("juan.garcia", Constants.AsocianteRole);
            GenerateUser("jorge.perez", Constants.DespachanteRole, sucursalRol);
            GenerateUser("marcos.sanchez", Constants.ReceptorRole, sucursalRol);
            GenerateUser("carlos.gonzales", Constants.VendedorRole, sucursalRol); 
        }

        private static void GenerateUser(string userName, params string[] roles)
        {
            MembershipUser user = Membership.GetUser(userName);
            if (user == null)
            {
                user = Membership.CreateUser(userName, Constants.DefaultPassword, string.Concat(userName, "@ribeiro.com"));
            }

            foreach (var rol in roles)
            {
                if (!string.IsNullOrWhiteSpace(rol) && !Roles.IsUserInRole(userName, rol))
                {
                    Roles.AddUserToRole(userName, rol);
                }
            }

            var profile = MobileTrackProfile.Create(userName);
            profile.Initialized = true;
            profile.Save();
        }
    }
}
